/* shell.c */
#include "shell.h"
#include <stdio.h>
#include <ctype.h>

#define ESC         0x1BU
#define ENTER       0x0DU
#define BACKSPACE   0x7FU
#define SPACE       0x20U


void get_line(char *buf, uint32_t len)
{
    char i;
    
    i = 0;
    memset(buf, len, 0);
    
    while(len--)
    {
        *buf = getchar();
        if(*buf == ENTER)
        {
            putchar('\r');
            putchar('\n');
            break;
        }
        
        switch(*buf)
        {
            case BACKSPACE:
                if(i > 0)
                {
                    len++;
                    *buf--;
                    putchar(BACKSPACE);
                    i--;
                }
                break;
            default:
                i++;
                putchar(*buf++);
                len--;
                break;
        }
    }
}

static int parse_line (char * line, char * argv[])
{
    uint8_t nargs = 0;
    
    if(line[0] == ENTER)
    {
        nargs = 0;
        return nargs;
    }
    
    while (nargs < SHELL_MAX_ARGS) 
    {
        /* 忽略前面的空格 */
        
        while (isblank(*line))
        {
            ++line;
        }
        
        /* 一行已经结束，没有更多的参数了 */
        if (*line == '\0')
        {
            argv[nargs] = NULL;
            return nargs;
        }
        argv[nargs++] = line; /* 参数字符串开始 */
        
        /* 寻找一行的结束符 */
        while ((*line) && (!isblank(*line)))
        {
            ++line;
        }
        
       /* 一行已经结束，没有更多的参数了 */
        if (*line == '\0') 
        {
            argv[nargs] = NULL;
            return nargs;
        }
        *line++ = '\0'; /* 将当前的参数字符串截断 */
    }
   
    printf ("** Too many args (max. %d) **\r\n", SHELL_MAX_ARGS);
    return (nargs);
}

void shell_loop(char* prompt, sh_cmd_t cmds, uint32_t num)
{
    int i;
    char cmd_buf[CMD_BUF_LEN];
    char *argv[SHELL_MAX_ARGS];
    int argc;
    
    while(1)
    {
        printf("%s>>", prompt);
        
        get_line(cmd_buf, CMD_BUF_LEN);
        argc = parse_line (cmd_buf, argv);
        
        /* 只输入了ENTER键 */
        if(!argc)
        {
            break;
        }
        
        for(i = 0; i < num; i++)
        {
            if(!strncmp(argv[0], cmds[i].name, sizeof(cmds[i].name)))
            {
                int res = cmds[i].fun(argc, argv);
                printf("%d\r\n", res);
                break;
            }
        }
        
        /* 没有可以匹配的命令 */
        if(i == num)
        {
            printf("command not found!\r\n");
        }
    }
}



